package co.edu.udea.herbario.dao;

import co.edu.udea.herbario.dto.Ejemplar;
import java.util.List;

/**
 *Clase de tipo interface que contiene la declaracion de los metodos utilizados para gestionar
 * los datos de la tabla Herb_Ejemplares entre la persistencia y la logica de la aplicacion
 *
 * @author Alejandro Areiza, Lorena Orozco, Marcela Colorado
 */
public interface EjemplarDao
{
    /**
	 * Metodo que obtiene desde la tabla Herb_Ejemplares el elemento referenciado con el codigo indicado
	 * como parametro
	 * 
	 * @param id es el codigo que identifica al ejemplar dentro del sistema
	 * 
	 * @return retorna un objeto de tipo Ejemplar
	 */
    public Ejemplar obtenerEjemplar(int id);

    /**
	 * Este metodo es el encargado de entregar en una lista todos los ejemplares registrados
	 * en el sistema de acuerdo al nombre de la familia pasado como parametro para la busqueda basica
	 *
	 * @param familia corresponde al nombre de la familia a la que pertenece el ejemplar
	 *
	 * @return retorna una lista de objetos tipo Ejemplar con todos los ejemplares relacionados con la familia
	 * indicada
	 */
	public List<Ejemplar> obtenerEjemplaresPorFamilia(String familia);

    /**
	 * Este metodo es el encargado de entregar en una lista todos los ejemplares registrados
	 * en el sistema de acuerdo al nombre del genero pasado como parametro para la busqueda basica
	 *
	 * @param genero corresponde al nombre del genero al que pertenece el ejemplar
	 *
	 * @return retorna una lista de objetos tipo Ejemplar con todos los ejemplares relacionados con el genero
	 * indicado
	 */
	public List<Ejemplar> obtenerEjemplaresPorGenero(String genero);

    /**
	 * Este metodo es el encargado de entregar en una lista todos los ejemplares registrados
	 * en el sistema de acuerdo al nombre cientifico pasado como parametro para la busqueda basica
	 *
	 * @param nombreCientifico corresponde al nombre cientifico del ejemplar
	 *
	 * @return retorna una lista de objetos tipo Ejemplar con todos los ejemplares relacionados con el nombre
	 * cientifico indicado
	 */
	public List<Ejemplar> obtenerEjemplaresPorNombreCientifico(String nombreCientifico);
    
    /**
	 * Este metodo es el encargado de entregar en una lista todos los ejemplares registrados
	 * en el sistema de acuerdo a la especie pasada como parametro
	 *
	 * @param especie hace referencia a la especie a la cual pertenece el ejemplar
	 *
	 * @return retorna una lista de objetos tipo Ejemplar con todos los ejemplares relacionados con
     * la especie 
	 */
	public List<Ejemplar> obtenerEjemplaresPorEspecie(String especie);

    /**
	 * Este metodo es el encargado de entregar en una lista todos los ejemplares registrados
	 * en el sistema de acuerdo a los datos pasados como parametros para la busqueda avanzada
	 *
	 * @param familia corresponde al nombre de la familia a la que pertenece el ejemplar
	 * @param genero corresponde al nombre del genero al que pertenece el ejemplar
	 * @param nombreCientifico corresponde al nombre cientifico asignado al ejemplar
	 * @param colectorPrincipal corresponde al nombre la persona que recolecto el ejemplar
	 * @param numeroColeccion corresponde al consecutivo asignado por el colector al ejemplar
	 * @param codigoBarras corresponde
	 * @param ubicacion corresponde al continente, pais, departamento y municipio en donde se encontro el ejemplar
	 *
	 * @return retorna una lista de objetos tipo Ejemplar que coincidan con los criterios de
	 * busqueda especificados
	 */
    public List<Ejemplar> obtenerListaEjemplares(String familia, String genero, String nombreCientifico,
            String colectorPrincipal, String numeroColeccion, String codigoBarras, int pais, int departamento,
            int municipio);

    /**
	 * Este metodo es el encargado de entregar en una lista los nombres de todos los nombres cientificos
     * de los ejemplares registrados en el sistema
     *
     * @param valorBusqueda indica la cadena de caracteres para buscar los nombres cientificos de la autocompletacion
	 *
	 * @return retorna una lista con los nombres cientificos de los ejemplares
	 */
    public List<String> obtenerNombresCientificos(String valorBusqueda);

    /**
	 * Metodo para crear un elemento en la tabla Herb_Ejemplares
	 *
	 * @param ejemplar es un objeto de tipo Ejemplar
	 *
	 * @return retorna un entero: res = 1 si se realizo correctamente la creacion, de lo contrario
	 * res = -1
	 */
    public int crearEjemplar(Ejemplar ejemplar);

    /**
	 * Permite llevar a cabo el proceso de modificacion de los datos asociados a un ejemplar
	 *
	 * @param ejemplar hace referencia a un objeto de tipo Ejemplar
	 *
	 * @return retorna un entero: res = 1 si se realizo correctamente la actualizacion, de
	 * lo contrario res = -1
	 */
    public int actualizarEjemplar(Ejemplar ejemplar);
}
